package com.itheima.listener;


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.itheima.domain.ExcelData;

import java.util.List;

public class ExceDataReadListener implements ReadListener<ExcelData> {
    //有个很重要的点ExcelDataReadListener不能被spring管理，要每次读取excel都要new, 然后里面用到spring可以构造方法传进去
    //private ExcelDataDao excelDataDao;
    //public ExcelDataReadListener(ExcelDataDao excelDataDao){
    //    this.excelDataDao = excelDataDao;
    //}


    //每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
    private static final int BATCH_COUNT = 100;

    //缓存的数据
    private List<ExcelData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    //每一条数据解析都会来调用此方法
    @Override
    public void invoke(ExcelData data, AnalysisContext context) {
        cachedDataList.add(data);//读取到一条记录添加到集合
        // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    //所有数据解析完成了, 会来调用此方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        saveData();
        System.out.println("所有数据解析完成！");
    }

    //数据保存到数据库
    private void saveData() {
        System.out.println("缓存集合已满,开始一次保存！");
        for (ExcelData excelData : cachedDataList) {
            System.out.println(excelData);

            //excelDataDao.save();
        }
    }
}
